#ifndef AST_INSTANCE
#define AST_INSTANCE
#include <string>
#include "node.h"

namespace AST {

    class Instance : public Node {

    private:

        /**
         * Tipagem de Instância
         */
        Node* _basetype;

        /**
         * Limite Máximo de Utilização
         */
        Node* _limit;

        /**
         * Configuração de Tipagem de Instância
         *
         * Durante a leitura da entrada apresentada pelo compilador, existem
         * algumas expressões que são consideradas como criação de novas
         * instâncias. No caso da linguagem, criação de novas instâncias podem
         * ser consideradas como definição de ponteiros utilizados como vetores,
         * que recebem um tipo considerado.
         *
         * @param  Node*     Tipagem de Instância
         * @return Instance* Próprio Objeto para Encadeamento
         */
        Instance* _setBasetype(Node*);

        /**
         * Configura o Limite Máximo de Utilização
         *
         * Durante a criação de um vetor na linguagem, precisamos informar o
         * limite máximo de utilização através de uma expressão. Esta expressão
         * deve ser criada como um nó de árvore abstrata de sintaxe. Este limite
         * máximo será a quantidade alocada de memória do tipo informado como
         * conteúdo do Token e pode ser gerada em tempo de execução.
         *
         * @param  Node*     Elemento para Configuração
         * @return Instance* Próprio Objeto para Encadeamento
         */
        Instance* _setLimit(Node*);

    public:

        /**
         * Construtor Padrão
         *
         * Método responsável pela criação de uma nova instância da classe para
         * representação de instâncias na linguagem. Estas instâncias são
         * ponteiros de vetores inicializados que recebem um identificador como
         * conteúdo e um nó de árvore abstrata de sintaxe que inicializa a
         * quantidade máxima de elementos que podem ser armazenados no vetor,
         * mais precisamente a quantidade de elementos que são reservados ao
         * ponteiro.
         *
         * @param Node* Tipagem de Instância
         * @param Node* Tamanho a ser Reservado durante a Inicialização
         */
        Instance(Node*, Node*);

        /**
         * Captura a Tipagem de Instância
         *
         * Apresenta o conteúdo capturado como tipo inicializado durante a
         * construção do objeto. Este conteúdo representa o tipo que deverá ser
         * utilizado para armazenamento no vetor a ser criado.
         *
         * @return std::string* Conteúdo Solicitado
         */
        Node* getBasetype();

        /**
         * Captura da Expressão Limitadora
         *
         * Nó de árvore abstrata de sintaxe que denota a quantidade máxima de
         * elementos que podem ser armazenados durante a inicialização do vetor
         * na linguagem. Este limite pode ser calculado em tempo de execução.
         *
         * @return Node* Elemento Solicitado
         */
        Node* getLimit();

        // Sobrescrita
        std::string toString(int);

    };

};

#endif

